<?php

class NotaCreditosController extends AppController {

    var $name = 'NotaCreditos';
    var $uses = array('NotaCredito', 'Cliente', 'Usuario', 'Devolucion');
    var $helpers = array('Formulario', 'Interfaz', 'AjaxAG');
    var $components = array('Interfaz', 'Maestro');
    var $layout = "ajax";
    var $paginate = array('limit' => 10, 'order' => array('NotaCredito.id' => 'DESC'));

    public function beforeFilter() {
        $this->validar_sesion();
    }
    
    public function afterFilter() {
        $this->auditoria();
    }
    
    public function index($busqueda = null) {
        extract($this->request->data);
        $data = null;
        $idCliente = null;
        $condiciones = array();
        $condicionesModelo = array();
        $condicionesCliente = array();
        $condiciones['NotaCredito.estatus !='] = 0;
        
        if(!empty($fechaInicio))
            $condiciones['DATE(NotaCredito.creado) BETWEEN ? AND ?'] = array($fechaInicio, $fechaFin);
        
        if(!empty($busqueda)){
            $condicionesModelo['NotaCredito.numero ILIKE'] = "%$busqueda%";
            $idCliente = $this->Cliente->buscar_clientes($busqueda);
            if (!empty($idCliente))
                $condicionesCliente['NotaCredito.cliente_id'] = $idCliente;
        } else {
            if(!empty($punto_id))
                $condiciones['NotaCredito.punto_id'] = $punto_id;
        }
        
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objNotCre = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
        $data = $this->paginate($objNotCre, array($condiciones, 'OR' => array($condicionesModelo, $condicionesCliente)));
        $this->set('url', $busqueda);
        $this->set('data', $data);
    }

    public function historial() {
        extract($this->request->data);
        $data = null;
        $condiciones['DATE(NotaCredito.creado)'] = date('Y-m-d');
        
        if(!empty($punto_id))
            $condiciones['NotaCredito.punto_id'] = $punto_id;
        
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objNotCre = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
        $data = $this->paginate($objNotCre, array($condiciones));

        $this->set('data', $data);
    }
    
    public function anular() {
        extract($this->request->data);
        $resultado = $this->verificarAnular('controlador', $idNCR);
        $resultado = explode('__', $resultado);

        if(!empty($claveAnularNCR) AND !empty($obsAnularNCR)) {
            switch($resultado[0]) {
                case '1':
                    $idCaja = $this->Session->read('punto_id');
                    $tiendaSesion = $this->Session->read('tiendaBD');
                    $ObjClavePermiso = $this->Maestro->modelo('punto', 'ClavePermiso', $tiendaSesion);
                    $objImpre = $this->Maestro->modelo('punto', 'Impresion', $tiendaSesion);

                    $datosClave = $ObjClavePermiso->find('all', array('conditions' => array('ClavePermiso.punto_id' => $idCaja, 'ClavePermiso.estatus' => 1, 'ClavePermiso.clave' => $claveAnularNCR, 'ClavePermiso.tipo' => 'anularNCR')));
                    
                    if(empty($datosClave)) {
                        echo'4__La contraseña es incorrecta';
                    }
                    else {
                        $objNcr = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
                        $objNcr->query('BEGIN WORK');
                        $tiendaSesion = $this->Session->read('tiendaBD');
                        $idNCR = $this->Interfaz->id($idNCR);

                        $nombreUser = $this->Session->read('username');

                        $resultado = $objNcr->updateAll(
                            array('NotaCredito.estatus' => 3, 'NotaCredito.observacion' => "'$obsAnularNCR'||chr(13)||'('||observacion||')'||chr(13)||'ANULADA POR SISTEMA ARAUCA POR EL USUARIO $nombreUser'", 'NotaCredito.modificado' => 'NOW()'), array('NotaCredito.id' => $idNCR));

                        if($resultado) {
                            $modificarClave = $ObjClavePermiso->updateAll(array('ClavePermiso.estatus' => 0), array('ClavePermiso.punto_id' => $idCaja, 'ClavePermiso.estatus' => 1, 'ClavePermiso.clave' => $claveAnularNCR));
                            
                            if($modificarClave) {
                                $objNcr->query('COMMIT');
                                echo "1__ANULADA" ;
                            }
                            else {
                                $objNcr->query('ROLLBACK');
                                echo "2__Ha surgido un error inesperado al guardar los datos" ;
                            }
                        }
                        else {
                            $objNcr->query('ROLLBACK');
                            echo "2__Ha surgido un error inesperado al guardar los datos";
                        }
                    }
                break;
                case '2':
                case '3':
                default:
                    echo '2__' . $resultado[1];
                break;
            }
        }
        else {
            echo  '2__Debe ingresar la clave para Anular la Nota de Credito';
        }
        $this->autoRender = false;
    }

    public function verificarAnular($tipoLlamada = 'ajax', $idNCR = '') {
        extract($this->request->data);
        if($idNCR == '') {
            $idEncriptado = $id;
            $idNCR = $this->Interfaz->id($id);
        }
        else {
            $idEncriptado = '';
            $idNCR = $this->Interfaz->id($idNCR);
        }

        $tiendaSesion = $this->Session->read('tiendaBD');
        $objNcr = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);

        $usuarioId = $this->Interfaz->id($this->Session->read('usuario_id'));
        $puntoId = $this->Session->read('punto_id');
        $fechaActual = date('Y-m-d');
    
        $datosNotaCredito = $objNcr->query("SELECT t.formapago, t.monto,
            CASE WHEN t.monto::double precision >= t.monto::double precision THEN 'true' ELSE 'false' END as montoret,
            (SELECT CASE WHEN COUNT(id)>0::bigint THEN 'true' ELSE 'false' END as nota FROM nota_creditos as n WHERE n.id=$idNCR AND n.nombre='DEVOLUCION' AND estatus=1),
            (SELECT CASE WHEN COUNT(id)>0::bigint THEN 'true' ELSE 'false' END as devolucion FROM nota_creditos as n WHERE n.id=$idNCR AND n.nombre='DEVOLUCION'),
            n.pagado AS pagado, n.monto AS montoncr FROM (select * FROM fnc_cierre_caja_punto('resumen','$fechaActual', '$usuarioId', $puntoId)
                AS (tipo_id text,formapago text, monto text,montoret text,montoretisrl text)) AS t,
                nota_creditos n WHERE t.formapago='EFECTIVO' AND n.id = $idNCR;");


        $respuesta = '';
        if(!empty($datosNotaCredito)) {
            $datosNCR = $datosNotaCredito[0][0];

            if($datosNCR['montoret'] == 'true' AND $datosNCR['devolucion'] == 'true' AND $datosNCR['nota'] == 'true') {
                $respuesta = "1__Confirmar Anulacion de nota de credito__" . $idEncriptado;
            }
            elseif($datosNCR['montoret'] == 'false') {
                $respuesta = "2__No posee suficiente efectivo en caja para realizar la Anulacion";
            }
            elseif($datosNCR['devolucion'] == 'false') {
                $respuesta = "3__Esta Nota de Credito no posee una Devolucion";
            }
            elseif($datosNCR['nota'] == 'false') {
                $respuesta = "3__Esta Nota de Credito ya ha sido Anulada";
            }
        }
        else {
            $respuesta = "2__No posee suficiente efectivo en caja para realizar la Anulacion";
        }

        if($tipoLlamada == 'ajax') {
            echo $respuesta;
            $this->autoRender = false;
        }
        else {
            $this->autoRender = false;
            return $respuesta;
        }
    }

    public function logs() {
        extract($this->request->data);
        $id = $this->Interfaz->id($id);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objNcr = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
        $logNotaCredito = $objNcr->query("SELECT * FROM fnc_log_documento($id,'NCR') AS (id integer,documento character varying,fecha timestamp without time zone,tipo integer,descripcion character varying);");

        $this->set('log', $logNotaCredito);
    }

    public function detalle() {
        extract($this->request->data);
        $id = $this->Interfaz->id($id);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objNotCre = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
        $data = $objNotCre->find('first', array('conditions' => array('NotaCredito.id' => $id)));
        $datosUsuario = $this->Usuario->find('first', array('fields' => 'Usuario.usuario', 'conditions' => array('Usuario.id' => $data['NotaCredito']['usuario_id'])));

        $this->set('usuario', $datosUsuario['Usuario']['usuario']);
        $this->set('url', $id);
        $this->set('data', $data);
    }
}